package com.vzaar.transport.httpclient4;

import java.io.IOException;
import java.io.InputStream;

import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;

/**
 * Support for OAuth and commons HTTP 4.0 client using the signpost 1.1
 * open source library. This class is a wrapper for an HttpRequest 
 * method.
 * 
 * @author Marc G. Smith
 */
class HttpRequestAdapter implements oauth.signpost.http.HttpRequest 
{

	///////////////////////////////////////////////////////////////////////////
	// Private Members ////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////
    
    private HttpRequest request;
    private HttpEntity entity;

	///////////////////////////////////////////////////////////////////////////
	// Public Methods /////////////////////////////////////////////////////////
	///////////////////////////////////////////////////////////////////////////

    /**
     * Constructor to wrap and delegate to an HTTP request method.
     * 
     * @param request the originating request to wrap around
     */
    public HttpRequestAdapter(HttpRequest request) {
        this.request = request;
        if (request instanceof HttpEntityEnclosingRequest) {
            entity = ((HttpEntityEnclosingRequest) request).getEntity();
        }
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public String getHeader(String name) {
        Header header = request.getFirstHeader(name);
        if (header == null) {
            return null;
        }
        return header.getValue();
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public String getMethod() {
        return request.getRequestLine().getMethod();
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public String getRequestUrl() {
        return request.getRequestLine().getUri();
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public void setHeader(String name, String value) {
        request.setHeader(name, value);
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public String getContentType() {
        if (entity == null) {
            return null;
        }
        Header header = entity.getContentType();
        if (header == null) {
            return null;
        }
        return header.getValue();
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
    public InputStream getMessagePayload() throws IOException {
        if (entity == null) {
            return null;
        }
        return entity.getContent();
    }

	///////////////////////////////////////////////////////////////////////////

    /**
     * Delegate method
     */
	public boolean hasPayload() throws IOException {
		return entity != null;
	}
	
	///////////////////////////////////////////////////////////////////////////
}